//
// Created by lz on 2021/2/15.
//

#ifndef MYWEBLIB_BASE_CURRENTTHREAD_H_
#define MYWEBLIB_BASE_CURRENTTHREAD_H_

#include "base/Types.h"

namespace lzweb
{
	namespace CurrentThread
	{
		// internal
		extern  __thread int t_cachedTid;
		extern  __thread char t_tidString[32];
		extern  __thread int t_tidStringLength;
		extern  __thread const char* t_threadName;
		void cacheTid();

		//获取由内核管理的唯一线程标志pid.
		inline int tid()
		{
			//函数原型： long __builtin_expect(long exp, long c);
			//这个指令是gcc引入的，作用是允许程序员将最有可能执行的分支告诉编译器
			//目的是将“分支转移”的信息提供给编译器，这样编译器可以对代码进行优化，以减少指令跳转带来的性能下降
			if(__builtin_expect(t_cachedTid == 0 , 0))
			{
				cacheTid();
			}
			return t_cachedTid;
		}
		inline const char* tidString()
		{
			return t_tidString;
		}
		inline int tidStringLength()
		{
			return t_tidStringLength;
		}
		inline const char* name()
		{
			return t_threadName;
		}

		bool isMainThread();

		void sleepUsec(int64_t usec);  // for testing

		string stackTrace(bool demangle);

	} // namespace CurrentThread
}// namespace lzweb



#endif //MYWEBLIB_BASE_CURRENTTHREAD_H_
